// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once // 防止头文件被重复包含

#include "Messages/GameplayMessageProcessor.h" // 包含游戏消息处理器基类

#include "ElimChainProcessor.generated.h" // 包含由Unreal Header Tool生成的代码

class APlayerState; // 前向声明玩家状态类
class UObject; // 前向声明UObject基类
struct FGameplayTag; // 前向声明游戏标签结构体
struct FLyraVerbMessage; // 前向声明Lyra动词消息结构体
template <typename T> struct TObjectPtr; // 前向声明模板类TObjectPtr

USTRUCT() // 标记为Unreal反射结构体
struct FPlayerElimChainInfo // 玩家连续击杀链信息结构体
{
	GENERATED_BODY() // 生成反射函数体

	double LastEliminationTime = 0.0; // 最后一次击杀的时间

	int32 ChainCounter = 1; // 连续击杀计数器
};

// 追踪连续击杀链（在每次击杀之间不超过Y秒的情况下连续完成X次击杀）
UCLASS(Abstract) // 标记为抽象类，不可直接实例化
class UElimChainProcessor : public UGameplayMessageProcessor // 继承自游戏消息处理器
{
	GENERATED_BODY() // 生成反射函数体

public:
	virtual void StartListening() override; // 开始监听消息的虚函数

protected:
	UPROPERTY(EditDefaultsOnly) // 仅在默认值编辑中可见的属性
	float ChainTimeLimit = 4.5f; // 连续击杀链的时间限制（秒）

	// 当玩家达到特定长度的连续击杀链时重新广播的事件标签
	UPROPERTY(EditDefaultsOnly) // 仅在默认值编辑中可见的属性
	TMap<int32, FGameplayTag> ElimChainTags; // 映射：连续击杀次数 -> 游戏标签

private:
	void OnEliminationMessage(FGameplayTag Channel, const FLyraVerbMessage& Payload); // 处理击杀消息的私有函数

private:
	UPROPERTY(Transient) // 标记为临时属性，不保存到磁盘
	TMap<TObjectPtr<APlayerState>, FPlayerElimChainInfo> PlayerChainHistory; // 玩家击杀链历史记录映射
};